Setup notebook

library(tidyverse)

Load data

AUC range

aha_pred %>%
  select(auc) %>%
  distinct() %>%
  ggplot()+
  geom_boxplot(aes(y= auc, x= "AHA"))+
  geom_point(aes(y= auc, x= "AHA"), alpha = 0.5)+
  labs(title = "AHA AUC range")+
  theme_classic()


pomms_pred %>%
  select(auc) %>%
  distinct() %>%
  ggplot()+
  geom_boxplot(aes(y= auc, x= "POMMS"))+
  geom_point(aes(y= auc, x= "POMMS"), alpha = 0.5)+
  labs(title = "POMMS AUC range")+
  theme_classic()

Best AUC

max = aha_pred$auc %>%
  max()

aha_pred %>%
  filter(auc == max) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Case, colour = timepoint))+
  geom_point(aes(x= treatment, y= Case, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="AHA to CHOICE")+
  theme_classic()


aha_pred %>%
  filter(auc == 0.94) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Control, colour = timepoint))+
  geom_point(aes(x= treatment, y= Control, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="AHA to CHOICE")+
  theme_classic()

max = pomms_pred$auc %>%
  max()

pomms_pred %>%
  filter(auc == max) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Case, colour = timepoint))+
  geom_point(aes(x= treatment, y= Case, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="POMMS to CHOICE")+
  theme_classic()


pomms_pred %>%
  filter(auc == 0.82) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Control, colour = timepoint))+
  geom_point(aes(x= treatment, y= Control, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="POMMS to CHOICE")+
  theme_classic()

#AUCs above 0.7

aha_pred %>%
  filter(auc > 0.7) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Case, colour = timepoint))+
  geom_point(aes(x= treatment, y= Case, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="AHA to CHOICE")+
  theme_classic()


aha_pred %>%
  filter(auc > 0.7) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Control, colour = timepoint))+
  geom_point(aes(x= treatment, y= Control, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="AHA to CHOICE")+
  theme_classic()

pomms_pred %>%
  filter(auc > 0.7) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Case, colour = timepoint))+
  geom_point(aes(x= treatment, y= Case, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="POMMS to CHOICE")+
  theme_classic()


pomms_pred %>%
  filter(auc > 0.7) %>%
  ggplot()+
  geom_boxplot(aes(x= treatment, y= Control, colour = timepoint))+
  geom_point(aes(x= treatment, y= Control, colour = timepoint), position=position_jitterdodge(), alpha = 0.2)+
  labs(title ="POMMS to CHOICE")+
  theme_classic()

ASV lookup table

CHOICE

Best AUC importances

max = aha_pred$auc %>%
  max()

#colnames(aha_importance)

importance_summary = aha_importance %>%
  filter(auc == max) %>%
  pivot_longer(cols = c("ATCCTATTATTTTATTATTTTACGAAACTAAACAAAGGTTCAGCAAGCGAGAATAATAAAAAAAG":"CATAAACTGGTAGCGACCGGCACCACCGGTAAACTGATCGCAGAAGCTACCGGCT"), names_to = "food", values_to = "importance") %>%
  group_by(label, food) %>%
  summarise(mean_importance = mean(importance)) %>%
  arrange(label, desc(mean_importance))
`summarise()` has grouped output by 'label'. You can override using the `.groups` argument.
ranking = importance_summary %>%
  pull(food)

top10 = ranking[1:10]

plot_food_direction(top10, input, "treatment")


name_list = c()
for(item in top10){
 name = common_names %>%
    filter(str_detect(asv, item)) %>%
    pull(common_name)
 name_list = append(name_list, name)
}
name_list
 [1] "cocoa bean"                                                                                                                   
 [2] "avocado, NA, NA, NA, NA, NA"                                                                                                  
 [3] "NA, ceylon cinnamon, bay leaf, avocado, NA, NA"                                                                               
 [4] "goji berry, NA, goji berry, cutleaf groundcherry, tomatillo, nightshade, NA, blackberry nightshade, potato, NA"               
 [5] "garlic"                                                                                                                       
 [6] "muscadine grape, common grape vine, NA, NA"                                                                                   
 [7] "common grape vine"                                                                                                            
 [8] "common grape vine"                                                                                                            
 [9] "black chokeberry, apple, NA, crab apple, european pear, NA, afghan pear, nashi pear, siberian pear, hybrid chinese white pear"
[10] "NA, pecan"                                                                                                                    
[11] "sesame"                                                                                                                       
max = pomms_pred$auc %>%
  max()

#colnames(pomms_importance)

importance_summary = pomms_importance %>%
  filter(auc == max) %>%
  pivot_longer(cols = c("ATCACGTTTTCCGAAAACAAACAAAGGTTCAGAAAGCGAAAATAAAAAAG":"ATCCTGTTTTCTCAAAACAAACAAAGGTTCAGAAAAAAAG"), names_to = "food", values_to = "importance") %>%
  group_by(label, food) %>%
  summarise(mean_importance = mean(importance)) %>%
  arrange(label, desc(mean_importance))
`summarise()` has grouped output by 'label'. You can override using the `.groups` argument.
ranking = importance_summary %>%
  pull(food)

top10 = ranking[1:10]

plot_food_direction(top10, input, "treatment")


name_list = c()
for(item in top10){
 name = common_names %>%
    filter(str_detect(asv, item)) %>%
    pull(common_name)
 name_list = append(name_list, name)
}
name_list
 [1] "dandelion"                                                                                                                                                                                                                                             
 [2] "sunflower, jerusalem artichoke, sunchoke, dandelion"                                                                                                                                                                                                   
 [3] "ashanti pepper, long pepper, black pepper, wild betel"                                                                                                                                                                                                 
 [4] "canola, rapeseed"                                                                                                                                                                                                                                      
 [5] "brown mustard, canola, rapeseed, black mustard, cabbage, broccoli, cauliflower, kale, Brussels sprouts, collard greens, savoy, kohlrabi, gai lan, mustards, bok choy, canola, rapeseed, field mustard, napa cabbage, turnip, rocket, NA, white mustard"
 [6] "oregano, NA, thyme"                                                                                                                                                                                                                                    
 [7] "sage"                                                                                                                                                                                                                                                  
 [8] "sage"                                                                                                                                                                                                                                                  
 [9] "NA, NA, rosemary"                                                                                                                                                                                                                                      
[10] "lemon balm, rosemary"                                                                                                                                                                                                                                  
[11] "sesame"                                                                                                                                                                                                                                                
[12] NA                                                                                                                                                                                                                                                      
[13] NA                                                                                                                                                                                                                                                      
[14] "NA, NA"                                                                                                                                                                                                                                                
[15] NA                                                                                                                                                                                                                                                      
[16] "rye, NA, NA, NA, NA, NA, bread wheat, NA, NA, NA, emmer wheat, spelt, einkorn, wild einkorn, spelt, NA, domesticated hulled wheat, NA, rivet wheat, durum wheat, wild einkorn, NA"                                                                     
[17] "coconut"                                                                                                                                                                                                                                               
[18] "fennel, dill, angelica, cumin, wild carrot, parsnip, parsley"                                                                                                                                                                                          
[19] "lettuce"                                                                                                                                                                                                                                               
[20] "flaxseed"                                                                                                                                                                                                                                              
[21] "tomato, NA"                                                                                                                                                                                                                                            

AUC above 0.7 importances

#colnames(aha_importance)

importance_summary = aha_importance %>%
  filter(auc >0.7) %>%
  pivot_longer(cols = c("ATCCTATTATTTTATTATTTTACGAAACTAAACAAAGGTTCAGCAAGCGAGAATAATAAAAAAAG":"CATAAACTGGTAGCGACCGGCACCACCGGTAAACTGATCGCAGAAGCTACCGGCT"), names_to = "food", values_to = "importance") %>%
  group_by(label, food) %>%
  summarise(mean_importance = mean(importance)) %>%
  arrange(label, desc(mean_importance))
`summarise()` has grouped output by 'label'. You can override using the `.groups` argument.
ranking = importance_summary %>%
  pull(food)

top10 = ranking[1:10]

plot_food_direction(top10, input, "treatment")


name_list = c()
for(item in top10){
 name = common_names %>%
    filter(str_detect(asv, item)) %>%
    pull(common_name)
 name_list = append(name_list, name)
}
name_list
 [1] "cocoa bean"                                                                                                                   
 [2] "avocado, NA, NA, NA, NA, NA"                                                                                                  
 [3] "NA, ceylon cinnamon, bay leaf, avocado, NA, NA"                                                                               
 [4] "garlic"                                                                                                                       
 [5] "goji berry, NA, goji berry, cutleaf groundcherry, tomatillo, nightshade, NA, blackberry nightshade, potato, NA"               
 [6] "muscadine grape, common grape vine, NA, NA"                                                                                   
 [7] "common grape vine"                                                                                                            
 [8] "common grape vine"                                                                                                            
 [9] "sesame"                                                                                                                       
[10] "NA, pecan"                                                                                                                    
[11] "black chokeberry, apple, NA, crab apple, european pear, NA, afghan pear, nashi pear, siberian pear, hybrid chinese white pear"
importance_summary = pomms_importance %>%
  filter(auc >0.7) %>%
  pivot_longer(cols = c("ATCACGTTTTCCGAAAACAAACAAAGGTTCAGAAAGCGAAAATAAAAAAG":"ATCCTGTTTTCTCAAAACAAACAAAGGTTCAGAAAAAAAG"), names_to = "food", values_to = "importance") %>%
  group_by(label, food) %>%
  summarise(mean_importance = mean(importance)) %>%
  arrange(label, desc(mean_importance))
`summarise()` has grouped output by 'label'. You can override using the `.groups` argument.
ranking = importance_summary %>%
  pull(food)

top10 = ranking[1:10]

plot_food_direction(top10, input, "treatment")


name_list = c()
for(item in top10){
 name = common_names %>%
    filter(str_detect(asv, item)) %>%
    pull(common_name)
 name_list = append(name_list, name)
}
name_list
 [1] "dandelion"                                                                                                                                                                                                                                             
 [2] "sunflower, jerusalem artichoke, sunchoke, dandelion"                                                                                                                                                                                                   
 [3] "tea"                                                                                                                                                                                                                                                   
 [4] "ashanti pepper, long pepper, black pepper, wild betel"                                                                                                                                                                                                 
 [5] "canola, rapeseed"                                                                                                                                                                                                                                      
 [6] "brown mustard, canola, rapeseed, black mustard, cabbage, broccoli, cauliflower, kale, Brussels sprouts, collard greens, savoy, kohlrabi, gai lan, mustards, bok choy, canola, rapeseed, field mustard, napa cabbage, turnip, rocket, NA, white mustard"
 [7] "rye, NA, NA, NA, NA, NA, bread wheat, NA, NA, NA, emmer wheat, spelt, einkorn, wild einkorn, spelt, NA, domesticated hulled wheat, NA, rivet wheat, durum wheat, wild einkorn, NA"                                                                     
 [8] "fennel, dill, angelica, cumin, wild carrot, parsnip, parsley"                                                                                                                                                                                          
 [9] "goji berry, NA, goji berry, cutleaf groundcherry, tomatillo, nightshade, NA, blackberry nightshade, potato, NA"                                                                                                                                        
[10] "coconut"                                                                                                                                                                                                                                               
[11] "lettuce"                                                                                                                                                                                                                                               
[12] "oat"                                                                                                                                                                                                                                                   
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBTZXR1cCBub3RlYm9vawoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMgTG9hZCBkYXRhCgpgYGB7cn0KYWhhX3ByZWQgPSByZWFkX2NzdigiL1VzZXJzL2FhMzcwL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL0JveC1Cb3gvcHJvamVjdF9kYXZpZGxhYi9MQURfTEFCX1BlcnNvbm5lbC9BbW1hcmFfQS9Qcm9qZWN0cy9NYWNoaW5lX2xlYXJuaW5nL0xBRF9sYWJfTUwvY29kZS9haGFfdG9fY2hvaWNlX3ByZWRpY3Rpb25zLmNzdiIpCgphaGFfaW1wb3J0YW5jZSA9IHJlYWRfY3N2KCIvVXNlcnMvYWEzNzAvTGlicmFyeS9DbG91ZFN0b3JhZ2UvQm94LUJveC9wcm9qZWN0X2RhdmlkbGFiL0xBRF9MQUJfUGVyc29ubmVsL0FtbWFyYV9BL1Byb2plY3RzL01hY2hpbmVfbGVhcm5pbmcvTEFEX2xhYl9NTC9jb2RlL2FoYV90b19jaG9pY2VfZmVhdHVyZV9pbXBvcnRhbmNlLmNzdiIpCgpwb21tc19wcmVkID0gcmVhZF9jc3YoIi9Vc2Vycy9hYTM3MC9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9Cb3gtQm94L3Byb2plY3RfZGF2aWRsYWIvTEFEX0xBQl9QZXJzb25uZWwvQW1tYXJhX0EvUHJvamVjdHMvTWFjaGluZV9sZWFybmluZy9MQURfbGFiX01ML2NvZGUvcG9tbXNfdG9fY2hvaWNlX3ByZWRpY3Rpb25zLmNzdiIpCgpwb21tc19pbXBvcnRhbmNlID0gcmVhZF9jc3YoIi9Vc2Vycy9hYTM3MC9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9Cb3gtQm94L3Byb2plY3RfZGF2aWRsYWIvTEFEX0xBQl9QZXJzb25uZWwvQW1tYXJhX0EvUHJvamVjdHMvTWFjaGluZV9sZWFybmluZy9MQURfbGFiX01ML2NvZGUvcG9tbXNfdG9fY2hvaWNlX2ZlYXR1cmVfaW1wb3J0YW5jZS5jc3YiKQpgYGAKIyBBVUMgcmFuZ2UKCmBgYHtyfQphaGFfcHJlZCAlPiUKICBzZWxlY3QoYXVjKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGdncGxvdCgpKwogIGdlb21fYm94cGxvdChhZXMoeT0gYXVjLCB4PSAiQUhBIikpKwogIGdlb21fcG9pbnQoYWVzKHk9IGF1YywgeD0gIkFIQSIpLCBhbHBoYSA9IDAuNSkrCiAgbGFicyh0aXRsZSA9ICJBSEEgQVVDIHJhbmdlIikrCiAgdGhlbWVfY2xhc3NpYygpCgpwb21tc19wcmVkICU+JQogIHNlbGVjdChhdWMpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9ib3hwbG90KGFlcyh5PSBhdWMsIHg9ICJQT01NUyIpKSsKICBnZW9tX3BvaW50KGFlcyh5PSBhdWMsIHg9ICJQT01NUyIpLCBhbHBoYSA9IDAuNSkrCiAgbGFicyh0aXRsZSA9ICJQT01NUyBBVUMgcmFuZ2UiKSsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgojIEJlc3QgQVVDCmBgYHtyfQptYXggPSBhaGFfcHJlZCRhdWMgJT4lCiAgbWF4KCkKCmFoYV9wcmVkICU+JQogIGZpbHRlcihhdWMgPT0gbWF4KSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ2FzZSwgY29sb3VyID0gdGltZXBvaW50KSkrCiAgZ2VvbV9wb2ludChhZXMoeD0gdHJlYXRtZW50LCB5PSBDYXNlLCBjb2xvdXIgPSB0aW1lcG9pbnQpLCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBhbHBoYSA9IDAuMikrCiAgbGFicyh0aXRsZSA9IkFIQSB0byBDSE9JQ0UiKSsKICB0aGVtZV9jbGFzc2ljKCkKCmFoYV9wcmVkICU+JQogIGZpbHRlcihhdWMgPT0gMC45NCkgJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9ib3hwbG90KGFlcyh4PSB0cmVhdG1lbnQsIHk9IENvbnRyb2wsIGNvbG91ciA9IHRpbWVwb2ludCkpKwogIGdlb21fcG9pbnQoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ29udHJvbCwgY29sb3VyID0gdGltZXBvaW50KSwgcG9zaXRpb249cG9zaXRpb25faml0dGVyZG9kZ2UoKSwgYWxwaGEgPSAwLjIpKwogIGxhYnModGl0bGUgPSJBSEEgdG8gQ0hPSUNFIikrCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKYGBge3J9Cm1heCA9IHBvbW1zX3ByZWQkYXVjICU+JQogIG1heCgpCgpwb21tc19wcmVkICU+JQogIGZpbHRlcihhdWMgPT0gbWF4KSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ2FzZSwgY29sb3VyID0gdGltZXBvaW50KSkrCiAgZ2VvbV9wb2ludChhZXMoeD0gdHJlYXRtZW50LCB5PSBDYXNlLCBjb2xvdXIgPSB0aW1lcG9pbnQpLCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBhbHBoYSA9IDAuMikrCiAgbGFicyh0aXRsZSA9IlBPTU1TIHRvIENIT0lDRSIpKwogIHRoZW1lX2NsYXNzaWMoKQoKcG9tbXNfcHJlZCAlPiUKICBmaWx0ZXIoYXVjID09IDAuODIpICU+JQogIGdncGxvdCgpKwogIGdlb21fYm94cGxvdChhZXMoeD0gdHJlYXRtZW50LCB5PSBDb250cm9sLCBjb2xvdXIgPSB0aW1lcG9pbnQpKSsKICBnZW9tX3BvaW50KGFlcyh4PSB0cmVhdG1lbnQsIHk9IENvbnRyb2wsIGNvbG91ciA9IHRpbWVwb2ludCksIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcmRvZGdlKCksIGFscGhhID0gMC4yKSsKICBsYWJzKHRpdGxlID0iUE9NTVMgdG8gQ0hPSUNFIikrCiAgdGhlbWVfY2xhc3NpYygpCmBgYAojQVVDcyBhYm92ZSAwLjcKCmBgYHtyfQphaGFfcHJlZCAlPiUKICBmaWx0ZXIoYXVjID4gMC43KSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ2FzZSwgY29sb3VyID0gdGltZXBvaW50KSkrCiAgZ2VvbV9wb2ludChhZXMoeD0gdHJlYXRtZW50LCB5PSBDYXNlLCBjb2xvdXIgPSB0aW1lcG9pbnQpLCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBhbHBoYSA9IDAuMikrCiAgbGFicyh0aXRsZSA9IkFIQSB0byBDSE9JQ0UiKSsKICB0aGVtZV9jbGFzc2ljKCkKCmFoYV9wcmVkICU+JQogIGZpbHRlcihhdWMgPiAwLjcpICU+JQogIGdncGxvdCgpKwogIGdlb21fYm94cGxvdChhZXMoeD0gdHJlYXRtZW50LCB5PSBDb250cm9sLCBjb2xvdXIgPSB0aW1lcG9pbnQpKSsKICBnZW9tX3BvaW50KGFlcyh4PSB0cmVhdG1lbnQsIHk9IENvbnRyb2wsIGNvbG91ciA9IHRpbWVwb2ludCksIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcmRvZGdlKCksIGFscGhhID0gMC4yKSsKICBsYWJzKHRpdGxlID0iQUhBIHRvIENIT0lDRSIpKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCgpgYGB7cn0KcG9tbXNfcHJlZCAlPiUKICBmaWx0ZXIoYXVjID4gMC43KSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ2FzZSwgY29sb3VyID0gdGltZXBvaW50KSkrCiAgZ2VvbV9wb2ludChhZXMoeD0gdHJlYXRtZW50LCB5PSBDYXNlLCBjb2xvdXIgPSB0aW1lcG9pbnQpLCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBhbHBoYSA9IDAuMikrCiAgbGFicyh0aXRsZSA9IlBPTU1TIHRvIENIT0lDRSIpKwogIHRoZW1lX2NsYXNzaWMoKQoKcG9tbXNfcHJlZCAlPiUKICBmaWx0ZXIoYXVjID4gMC43KSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2JveHBsb3QoYWVzKHg9IHRyZWF0bWVudCwgeT0gQ29udHJvbCwgY29sb3VyID0gdGltZXBvaW50KSkrCiAgZ2VvbV9wb2ludChhZXMoeD0gdHJlYXRtZW50LCB5PSBDb250cm9sLCBjb2xvdXIgPSB0aW1lcG9pbnQpLCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBhbHBoYSA9IDAuMikrCiAgbGFicyh0aXRsZSA9IlBPTU1TIHRvIENIT0lDRSIpKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMgQVNWIGxvb2t1cCB0YWJsZQoKYGBge3J9CiMgY29tYmluZWQgPSByZWFkUkRTKCIvVXNlcnMvYWEzNzAvTGlicmFyeS9DbG91ZFN0b3JhZ2UvQm94LUJveC9wcm9qZWN0X2RhdmlkbGFiL0xBRF9MQUJfUGVyc29ubmVsL0FtbWFyYV9BL1Byb2plY3RzL0NIT0lDRS9BbGxfY29ob3J0cy9kYXRhX29iamVjdHMvQ0hPSUNFX1BPTU1TX0FIQV9jb21iaW5lZF8yMDIyMTIxMy5yZHMiKQojIAojIGxvb2t1cCA9IGNvbWJpbmVkICU+JQojICAgdGF4X3RhYmxlKCkgJT4lCiMgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiMgICBhc190aWJibGUocm93bmFtZXMgPSBOQSkgJT4lCiMgICByb3duYW1lc190b19jb2x1bW4oImFzdiIpCmBgYAoKYGBge3J9CmNvbW1vbl9uYW1lcyA9IHJlYWRfY3N2KCIvVXNlcnMvYWEzNzAvTGlicmFyeS9DbG91ZFN0b3JhZ2UvQm94LUJveC9wcm9qZWN0X2RhdmlkbGFiL0xBRF9MQUJfUGVyc29ubmVsL0JyaWFubmEgUC9kaWV0L2Zvb2QtZGJzL2RhdGEvb3V0cHV0cy9kYWRhMi1jb21wYXRpYmxlL3RybkwvdHJuTEdIIEFTViBjb21tb24gbmFtZXMuY3N2IikKYGBgCgoKIyBDSE9JQ0UKCmBgYHtyfQpjX3BzID0gcmVhZFJEUygiL1VzZXJzL2FhMzcwL0xpYnJhcnkvQ2xvdWRTdG9yYWdlL0JveC1Cb3gvcHJvamVjdF9kYXZpZGxhYi9MQURfTEFCX1BlcnNvbm5lbC9BbW1hcmFfQS9Qcm9qZWN0cy9DSE9JQ0UvQ0hPSUNFX1RybmwvQ0hPSUNFXzIwMjIwOTEyL3BzX29iamVjdHMvY2hvaWNlX2NvbXBsZXRlXzIwMjIxMjA1X2NsZWFuLnJkcyIpCgpvdHVfY2xyID0gYWJ1bmRhbmNlcyhjX3BzLCAiY2xyIikgJT4lICMgY2xyIHRyYW5zZm9ybQogIHQoKQoKY19wcyA9IHBoeWxvc2VxKG90dV90YWJsZShvdHVfY2xyLCB0YXhhX2FyZV9yb3dzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgc2FtcGxlX2RhdGEoc2FtcGxlX2RhdGEoY19wcykpLAogICAgICAgICAgICAgICAgICAgdGF4X3RhYmxlKHRheF90YWJsZShjX3BzKSkpCnNhbWRmID0gY19wcyAlPiUKICBzYW1wbGVfZGF0YSgpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhc190aWJibGUocm93bmFtZXMgPSBOQSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzYW1wbGUiKSAlPiUKICBzZWxlY3Qoc2FtcGxlLCBpZCwgdHJlYXRtZW50LCB0cnVlX3dlZWssIHRpbWVwb2ludCkKCm90dWRmID0gY19wcyAlPiUKICBvdHVfdGFibGUoKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gTkEpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic2FtcGxlIikKCmlucHV0ID0gc2FtZGYgJT4lCiAgbGVmdF9qb2luKG90dWRmKQpgYGAKIyBCZXN0IEFVQyBpbXBvcnRhbmNlcwpgYGB7cn0KbWF4ID0gYWhhX3ByZWQkYXVjICU+JQogIG1heCgpCgojY29sbmFtZXMoYWhhX2ltcG9ydGFuY2UpCgppbXBvcnRhbmNlX3N1bW1hcnkgPSBhaGFfaW1wb3J0YW5jZSAlPiUKICBmaWx0ZXIoYXVjID09IG1heCkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJBVENDVEFUVEFUVFRUQVRUQVRUVFRBQ0dBQUFDVEFBQUNBQUFHR1RUQ0FHQ0FBR0NHQUdBQVRBQVRBQUFBQUFBRyI6IkNBVEFBQUNUR0dUQUdDR0FDQ0dHQ0FDQ0FDQ0dHVEFBQUNUR0FUQ0dDQUdBQUdDVEFDQ0dHQ1QiKSwgbmFtZXNfdG8gPSAiZm9vZCIsIHZhbHVlc190byA9ICJpbXBvcnRhbmNlIikgJT4lCiAgZ3JvdXBfYnkobGFiZWwsIGZvb2QpICU+JQogIHN1bW1hcmlzZShtZWFuX2ltcG9ydGFuY2UgPSBtZWFuKGltcG9ydGFuY2UpKSAlPiUKICBhcnJhbmdlKGxhYmVsLCBkZXNjKG1lYW5faW1wb3J0YW5jZSkpCgpyYW5raW5nID0gaW1wb3J0YW5jZV9zdW1tYXJ5ICU+JQogIHB1bGwoZm9vZCkKCnRvcDEwID0gcmFua2luZ1sxOjEwXQoKcGxvdF9mb29kX2RpcmVjdGlvbih0b3AxMCwgaW5wdXQsICJ0cmVhdG1lbnQiKQoKbmFtZV9saXN0ID0gYygpCmZvcihpdGVtIGluIHRvcDEwKXsKIG5hbWUgPSBjb21tb25fbmFtZXMgJT4lCiAgICBmaWx0ZXIoc3RyX2RldGVjdChhc3YsIGl0ZW0pKSAlPiUKICAgIHB1bGwoY29tbW9uX25hbWUpCiBuYW1lX2xpc3QgPSBhcHBlbmQobmFtZV9saXN0LCBuYW1lKQp9Cm5hbWVfbGlzdApgYGAKCmBgYHtyfQptYXggPSBwb21tc19wcmVkJGF1YyAlPiUKICBtYXgoKQoKI2NvbG5hbWVzKHBvbW1zX2ltcG9ydGFuY2UpCgppbXBvcnRhbmNlX3N1bW1hcnkgPSBwb21tc19pbXBvcnRhbmNlICU+JQogIGZpbHRlcihhdWMgPT0gbWF4KSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkFUQ0FDR1RUVFRDQ0dBQUFBQ0FBQUNBQUFHR1RUQ0FHQUFBR0NHQUFBQVRBQUFBQUFHIjoiQVRDQ1RHVFRUVENUQ0FBQUFDQUFBQ0FBQUdHVFRDQUdBQUFBQUFBRyIpLCBuYW1lc190byA9ICJmb29kIiwgdmFsdWVzX3RvID0gImltcG9ydGFuY2UiKSAlPiUKICBncm91cF9ieShsYWJlbCwgZm9vZCkgJT4lCiAgc3VtbWFyaXNlKG1lYW5faW1wb3J0YW5jZSA9IG1lYW4oaW1wb3J0YW5jZSkpICU+JQogIGFycmFuZ2UobGFiZWwsIGRlc2MobWVhbl9pbXBvcnRhbmNlKSkKCnJhbmtpbmcgPSBpbXBvcnRhbmNlX3N1bW1hcnkgJT4lCiAgcHVsbChmb29kKQoKdG9wMTAgPSByYW5raW5nWzE6MTBdCgpwbG90X2Zvb2RfZGlyZWN0aW9uKHRvcDEwLCBpbnB1dCwgInRyZWF0bWVudCIpCgpuYW1lX2xpc3QgPSBjKCkKZm9yKGl0ZW0gaW4gdG9wMTApewogbmFtZSA9IGNvbW1vbl9uYW1lcyAlPiUKICAgIGZpbHRlcihzdHJfZGV0ZWN0KGFzdiwgaXRlbSkpICU+JQogICAgcHVsbChjb21tb25fbmFtZSkKIG5hbWVfbGlzdCA9IGFwcGVuZChuYW1lX2xpc3QsIG5hbWUpCn0KbmFtZV9saXN0CmBgYAoKIyBBVUMgYWJvdmUgMC43IGltcG9ydGFuY2VzCmBgYHtyfQojY29sbmFtZXMoYWhhX2ltcG9ydGFuY2UpCgppbXBvcnRhbmNlX3N1bW1hcnkgPSBhaGFfaW1wb3J0YW5jZSAlPiUKICBmaWx0ZXIoYXVjID4wLjcpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYygiQVRDQ1RBVFRBVFRUVEFUVEFUVFRUQUNHQUFBQ1RBQUFDQUFBR0dUVENBR0NBQUdDR0FHQUFUQUFUQUFBQUFBQUciOiJDQVRBQUFDVEdHVEFHQ0dBQ0NHR0NBQ0NBQ0NHR1RBQUFDVEdBVENHQ0FHQUFHQ1RBQ0NHR0NUIiksIG5hbWVzX3RvID0gImZvb2QiLCB2YWx1ZXNfdG8gPSAiaW1wb3J0YW5jZSIpICU+JQogIGdyb3VwX2J5KGxhYmVsLCBmb29kKSAlPiUKICBzdW1tYXJpc2UobWVhbl9pbXBvcnRhbmNlID0gbWVhbihpbXBvcnRhbmNlKSkgJT4lCiAgYXJyYW5nZShsYWJlbCwgZGVzYyhtZWFuX2ltcG9ydGFuY2UpKQoKcmFua2luZyA9IGltcG9ydGFuY2Vfc3VtbWFyeSAlPiUKICBwdWxsKGZvb2QpCgp0b3AxMCA9IHJhbmtpbmdbMToxMF0KCnBsb3RfZm9vZF9kaXJlY3Rpb24odG9wMTAsIGlucHV0LCAidHJlYXRtZW50IikKCm5hbWVfbGlzdCA9IGMoKQpmb3IoaXRlbSBpbiB0b3AxMCl7CiBuYW1lID0gY29tbW9uX25hbWVzICU+JQogICAgZmlsdGVyKHN0cl9kZXRlY3QoYXN2LCBpdGVtKSkgJT4lCiAgICBwdWxsKGNvbW1vbl9uYW1lKQogbmFtZV9saXN0ID0gYXBwZW5kKG5hbWVfbGlzdCwgbmFtZSkKfQpuYW1lX2xpc3QKYGBgCgpgYGB7cn0KaW1wb3J0YW5jZV9zdW1tYXJ5ID0gcG9tbXNfaW1wb3J0YW5jZSAlPiUKICBmaWx0ZXIoYXVjID4wLjcpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYygiQVRDQUNHVFRUVENDR0FBQUFDQUFBQ0FBQUdHVFRDQUdBQUFHQ0dBQUFBVEFBQUFBQUciOiJBVENDVEdUVFRUQ1RDQUFBQUNBQUFDQUFBR0dUVENBR0FBQUFBQUFHIiksIG5hbWVzX3RvID0gImZvb2QiLCB2YWx1ZXNfdG8gPSAiaW1wb3J0YW5jZSIpICU+JQogIGdyb3VwX2J5KGxhYmVsLCBmb29kKSAlPiUKICBzdW1tYXJpc2UobWVhbl9pbXBvcnRhbmNlID0gbWVhbihpbXBvcnRhbmNlKSkgJT4lCiAgYXJyYW5nZShsYWJlbCwgZGVzYyhtZWFuX2ltcG9ydGFuY2UpKQoKcmFua2luZyA9IGltcG9ydGFuY2Vfc3VtbWFyeSAlPiUKICBwdWxsKGZvb2QpCgp0b3AxMCA9IHJhbmtpbmdbMToxMF0KCnBsb3RfZm9vZF9kaXJlY3Rpb24odG9wMTAsIGlucHV0LCAidHJlYXRtZW50IikKCm5hbWVfbGlzdCA9IGMoKQpmb3IoaXRlbSBpbiB0b3AxMCl7CiBuYW1lID0gY29tbW9uX25hbWVzICU+JQogICAgZmlsdGVyKHN0cl9kZXRlY3QoYXN2LCBpdGVtKSkgJT4lCiAgICBwdWxsKGNvbW1vbl9uYW1lKQogbmFtZV9saXN0ID0gYXBwZW5kKG5hbWVfbGlzdCwgbmFtZSkKfQpuYW1lX2xpc3QKYGBgCgoK